﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using BaHuan.BusinessLayer;
using BaHuan.Common;
using BaHuan.Entities;
using BaHuan.Utils;

namespace BaHuan
{
    public partial class FrmUyNhiemChi : Form
    {
        private ChiNhanhCongTyMgt chinhanhctyMgt = new ChiNhanhCongTyMgt();
        private NhaCungCapManagement nhacungcapMgt = new NhaCungCapManagement();
        private UyNhiemChiManagement uynhiemchiMgt = new UyNhiemChiManagement();
        private NganHangManagement nganhangMgt = new NganHangManagement();
        private NganHangDoiTacManagement nganhangdoitacMgt = new NganHangDoiTacManagement();
        private ButToanMgt buttoanMgt = new ButToanMgt();
        private TaiKhoanGiaoDichManagement taikhoangiaodichMgt = new TaiKhoanGiaoDichManagement();
        private TaiKhoanGiaoDichDoiTacManagement taikhoangiaodichdoitacMgt = new TaiKhoanGiaoDichDoiTacManagement();
        private BangMaPhieuMgt bangmaphieuMgt = new BangMaPhieuMgt();

        private int idLoaiPhieu = 13;
        private bool IsEdited;
        private UyNhiemChi mUyNhiemChi = null;

        private DateTime dtOld = new DateTime();
        private string prefixOld = "";

        private NhanVien nhanvien;
        public NhanVien NhanVien
        {
            set { this.nhanvien = value; }
            get { return this.nhanvien; }
        }

        public List<ChiNhanhCongTy> GetAllChiNhanhCongTy()
        {
            ResultObj resultObj = new ResultObj();
            resultObj = chinhanhctyMgt.GetAllChiNhanhCongTy();
            List<ChiNhanhCongTy> listChiNhanhCongTy = (List<ChiNhanhCongTy>)resultObj.Result;
            return listChiNhanhCongTy;
        }

        public List<NhaCungCap> GetAllNhaCungCap()
        {
            ResultObj resultObj = new ResultObj();
            resultObj = nhacungcapMgt.GetAllNhaCungCap();
            List<NhaCungCap> listNhaCungCap = (List<NhaCungCap>)resultObj.Result;
            return listNhaCungCap;
        }

        public List<UyNhiemChi> GetAllUyNhiemChi()
        {
            ResultObj resultObj = new ResultObj();
            resultObj = uynhiemchiMgt.GetAllUyNhiemChi();
            List<UyNhiemChi> listUyNhiemChi = (List<UyNhiemChi>)resultObj.Result;
            return listUyNhiemChi;
        }

        public List<NganHang> GetAllNganHang()
        {
            ResultObj resultObj = new ResultObj();
            resultObj = nganhangMgt.GetAllNganHang();
            List<NganHang> listNganHang = (List<NganHang>)resultObj.Result;
            return listNganHang;
        }

        public List<NganHangDoiTac> GetAllNganHangDoiTac()
        {
            ResultObj resultObj = new ResultObj();
            resultObj = nganhangdoitacMgt.GetAllNganHangDoiTac();
            List<NganHangDoiTac> listNganHangDoiTac = (List<NganHangDoiTac>)resultObj.Result;
            return listNganHangDoiTac;
        }

        public List<ButToan> GetAllButToan()
        {
            ResultObj resultObj = new ResultObj();

            resultObj = buttoanMgt.GetAllButToan();
            List<ButToan> listButToan = (List<ButToan>)resultObj.Result;

            return listButToan;
        }

        public List<TaiKhoanGiaoDich> GetAllTaiKhoanGiaoDich()
        {
            ResultObj resultObj = new ResultObj();

            resultObj = taikhoangiaodichMgt.GetAllTaiKhoanGiaoDich();
            List<TaiKhoanGiaoDich> listTaiKhoanGiaoDich = (List<TaiKhoanGiaoDich>)resultObj.Result;

            return listTaiKhoanGiaoDich;
        }

        public List<TaiKhoanGiaoDichDoiTac> GetAllTaiKhoanGiaoDichDoiTac()
        {
            ResultObj resultObj = new ResultObj();

            resultObj = taikhoangiaodichdoitacMgt.GetAllTaiKhoanGiaoDichDoiTac();
            List<TaiKhoanGiaoDichDoiTac> listTaiKhoanGiaoDichDoiTac = (List<TaiKhoanGiaoDichDoiTac>)resultObj.Result;

            return listTaiKhoanGiaoDichDoiTac;
        }

        public List<BangMaPhieu> GetAllBangMaPhieu(int id)
        {
            ResultObj resultObj = new ResultObj();

            resultObj = bangmaphieuMgt.GetAllBangMaPhieuByIDLoaiPhieu(id);
            List<BangMaPhieu> listBangMaPhieu = (List<BangMaPhieu>)resultObj.Result;

            return listBangMaPhieu;
        }

        public FrmUyNhiemChi()
        {
            InitializeComponent();
        }

        public FrmUyNhiemChi(NhanVien nhanvien)
        {
            InitializeComponent();

            this.nhanvien = nhanvien;
            txtNguoiLap.Text = nhanvien.HoTen;
            BindingToCbo();
        }

        public FrmUyNhiemChi(UyNhiemChi uynhiemchi, NhanVien nhanvien)
        {
            InitializeComponent();

            panel1.Enabled = false;
            btnLuu.Enabled = false;
            btnSua.Enabled = true;
            btnXoa.Enabled = true;
            btnDinhKhoan.Enabled = true;
            btnIn.Enabled = true;

            this.mUyNhiemChi = uynhiemchi;
            this.NhanVien = nhanvien;
            BindingToCbo();

            ChiNhanhCongTy chinhanhcongty = (from cn in GetAllChiNhanhCongTy()
                                             where cn.Id == this.mUyNhiemChi.IdChiNhanhCongTy
                                             select cn).FirstOrDefault();

            if (chinhanhcongty != null)
            {
                dtOld = this.mUyNhiemChi.NgayThang;
                dtpNgayThang.Value = this.mUyNhiemChi.NgayThang;

                prefixOld = this.mUyNhiemChi.Prefix;
                cboPrefix.Text = this.mUyNhiemChi.Prefix;
                txtMaSo.Text = this.mUyNhiemChi.OrderNumber;
                
                cboDonViChi.Text = chinhanhcongty.TenChiNhanh;
                cboDonViNhan.SelectedValue = this.mUyNhiemChi.IdNhaCungCap;
                cboNganHangChuyen.SelectedValue = this.mUyNhiemChi.IdNganHang;
                cboNganHangNhan.SelectedValue = this.mUyNhiemChi.IdNganHangNhan;
                cboTaiKhoanChuyen.SelectedValue = this.mUyNhiemChi.IdTaiKhoanGiaoDich;
                cboTaiKhoanNhan.SelectedValue = this.mUyNhiemChi.IdTaiKhoanNhan;
                txtNoiDung.Text = this.mUyNhiemChi.NoiDung;
                txtSoTien.Text = this.mUyNhiemChi.SoTien.ToString();
                txtNguoiLap.Text = this.mUyNhiemChi.NguoiLap;
                txtGhiChu.Text = this.mUyNhiemChi.GhiChu;
                lblId.Text = this.mUyNhiemChi.Id.ToString();
            }
        }

        private void txtSoTien_TextChanged(object sender, EventArgs e)
        {
            if (txtSoTien.Text != "")
            {
                txtSoTien.SelectionStart = txtSoTien.Text.Length + 1;
                string num = txtSoTien.Text.Replace(".", "");
                txtSoTien.Text = (Convert.ToInt64(num).ToString("N0")).Replace(",", ".");
            }
        }

        public void EditOrRemoveDinhKhoan(string MaSo)
        {
            ResultObj resultObj = new ResultObj();

            List<ButToan> lst = (from p in GetAllButToan()
                                 where p.SoChungTu == MaSo
                                 select p).ToList();

            if (lst.Count > 0)
            {
                foreach (ButToan b in lst)
                {
                    b.IsEdited = 1;
                    resultObj = buttoanMgt.UpdateButToan(b);
                }
            }
        }

        public void RefreshControl()
        {
            cboPrefix.Text = "";
            txtNoiDung.Text = "";
            txtGhiChu.Text = "";
            txtSoTien.Text = "";

            cboDonViChi.SelectedIndex = 0;
            cboDonViNhan.SelectedIndex = 0;
            cboNganHangChuyen.SelectedIndex = 0;
            cboTaiKhoanNhan.DataSource = null;

            lblId.Text = "";
            dtpNgayThang.Value = DateTime.Now;
        }

        public void BindingToCbo()
        {
            cboDonViChi.DataSource = GetAllChiNhanhCongTy();
            cboDonViChi.DisplayMember = "TenChiNhanh";
            cboDonViChi.ValueMember = "Id";

            cboDonViNhan.DataSource = GetAllNhaCungCap();
            cboDonViNhan.DisplayMember = "TenNhaCungCap";
            cboDonViNhan.ValueMember = "Id";

            cboNganHangChuyen.DataSource = GetAllNganHang();
            cboNganHangChuyen.DisplayMember = "Ten";
            cboNganHangChuyen.ValueMember = "Id";

            cboPrefix.DataSource = GetAllBangMaPhieu(idLoaiPhieu);
            cboPrefix.DisplayMember = "MaSo";
            cboPrefix.ValueMember = "Id";
        }

        private void txtSoTien_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
            {
                MessageBox.Show("Vui lòng nhập số !");
                e.Handled = true;
            }
        }

        private void cboDonViChi_Leave(object sender, EventArgs e)
        {
            foreach (ChiNhanhCongTy b in cboDonViChi.Items)
            {
                if (b.TenChiNhanh.ToLower().Contains(cboDonViChi.Text) && cboDonViChi.Text != "")
                {
                    cboDonViChi.SelectedValue = b.Id;
                    break;
                }
            }

            if (cboDonViChi.SelectedValue == null)
            {
                cboDonViChi.Text = "";
            }
        }

        private void cboDonViNhan_Leave(object sender, EventArgs e)
        {
            if (cboDonViNhan.SelectedIndex == 1)
            {
                foreach (NhaCungCap p in cboDonViNhan.Items)
                {
                    if (p.TenNhaCungCap.ToLower().Contains(cboDonViNhan.Text) && cboDonViNhan.Text != "")
                    {
                        cboDonViNhan.SelectedValue = p.Id;
                        break;
                    }
                }
            }

            if (cboDonViNhan.SelectedValue == null)
            {
                cboDonViNhan.Text = "";
            }
        }

        private void btnXoa_Click(object sender, EventArgs e)
        {
            btnLuu.Enabled = false;
            btnSua.Enabled = false;
            btnXoa.Enabled = false;
            btnDinhKhoan.Enabled = false;
            btnIn.Enabled = false;

            ResultObj result = new ResultObj();
            if (lblId.Text == "")
            {
                MessageBox.Show("Không thể xóa","Thông báo");
                return;
            }

            DialogResult Dialogresult;
            Dialogresult = MessageBox.Show("Bạn có chắc chắn muốn xóa nhà cung cấp này không?", "Xóa nhà cung cấp", MessageBoxButtons.YesNo);
            if (Dialogresult == DialogResult.Yes)
            {
                mUyNhiemChi.Id = Convert.ToInt32(lblId.Text);
                mUyNhiemChi.IsDelete = 1;

                result = uynhiemchiMgt.UpdateUyNhiemChi(mUyNhiemChi);
                EditOrRemoveDinhKhoan(mUyNhiemChi.MaSo);

                if (result.ReturnCode > 0)
                {
                    MessageBox.Show("Đã xoá thành công.", "Thông báo");
                    this.Close();
                }

                else if (result.ReturnCode == Definitions.DUPLICATED_VALUE)
                    MessageBox.Show("Dữ liệu bị trùng !", "Thông báo");
                else
                    MessageBox.Show("Xoá Thất bại !", "Thông báo");
            }
        }

        private void btnSua_Click(object sender, EventArgs e)
        {
            panel1.Enabled = true;
            btnLuu.Enabled = true;
            IsEdited = true;

            btnXoa.Enabled = false;
            btnDinhKhoan.Enabled = false;
            btnIn.Enabled = false;
            btnSua.Enabled = false;
        }

        private void btnLuu_Click(object sender, EventArgs e)
        {
            if (txtMaSo.Text == "")
            {
                MessageBox.Show("Vui lòng chọn mã phiếu");
                return;
            }

            if (txtSoTien.Text.Replace(".", "") == "" || cboDonViChi.Text == "" || cboDonViNhan.Text == "" || cboNganHangChuyen.Text == "" || cboNganHangNhan.Text == "")
            {
                MessageBox.Show("Vui lòng nhập đầy đủ thông tin cần thiết", "Thông báo");
                return;
            }
            else
            {
                ResultObj resultObj = new ResultObj();

                UyNhiemChi uynhiemchi = new UyNhiemChi();
                uynhiemchi.Prefix = cboPrefix.Text;
                uynhiemchi.OrderNumber = txtMaSo.Text;
                uynhiemchi.MaSo = cboPrefix.Text + "/" + dtpNgayThang.Value.ToString("MM") + dtpNgayThang.Value.ToString("yy") + "/" + txtMaSo.Text;
                uynhiemchi.History = "";
                uynhiemchi.NgayThang = dtpNgayThang.Value;
                uynhiemchi.NoiDung = txtNoiDung.Text;
                uynhiemchi.GhiChu = txtGhiChu.Text;
                uynhiemchi.NguoiLap = txtNguoiLap.Text;

                if (cboDonViChi.SelectedItem == null)
                    return;
                uynhiemchi.IdChiNhanhCongTy = ((ChiNhanhCongTy)cboDonViChi.SelectedItem).Id;

                if (cboNganHangChuyen.Text == "")
                {
                    MessageBox.Show("Vui lòng chọn ngân hàng chuyển tiền", "Thông báo");
                    return;
                }
                uynhiemchi.IdNganHang = ((NganHang)cboNganHangChuyen.SelectedItem).Id;
                uynhiemchi.IdTaiKhoanGiaoDich = ((TaiKhoanGiaoDich)cboTaiKhoanChuyen.SelectedItem).Id;

                if (cboDonViNhan.Text == "")
                {
                    MessageBox.Show("Vui lòng chọn đơn vị nhận tiền", "Thông báo");
                    return;
                }

                uynhiemchi.IdNhaCungCap = ((NhaCungCap)cboDonViNhan.SelectedItem).Id;

                if (cboNganHangNhan.Text == "")
                {
                    MessageBox.Show("Vui lòng chọn ngân hàng nhận tiền", "Thông báo");
                    return;
                }
                uynhiemchi.IdNganHangNhan = ((NganHangDoiTac)cboNganHangNhan.SelectedItem).Id;
                uynhiemchi.IdTaiKhoanNhan = ((TaiKhoanGiaoDichDoiTac)cboTaiKhoanNhan.SelectedItem).Id;

                if (string.IsNullOrEmpty(txtSoTien.Text))
                {
                    MessageBox.Show("Vui lòng nhập số tiền", "Thông báo");
                    return;
                }
                uynhiemchi.SoTien = Convert.ToInt64(txtSoTien.Text.Replace(".", ""));

                //save
                if (!IsEdited)
                {
                    resultObj = uynhiemchiMgt.SaveNewUyNhiemChi(uynhiemchi);
                    lblId.Text = resultObj.ReturnCode.ToString();
                }
                //update
                else
                {
                    uynhiemchi.Id = Convert.ToInt32(lblId.Text);
                    resultObj = uynhiemchiMgt.UpdateUyNhiemChi(uynhiemchi);
                }

                if (resultObj.ReturnCode > 0)
                {
                    EditOrRemoveDinhKhoan(uynhiemchi.MaSo);

                    MessageBox.Show("Lưu thành công. Vui lòng cập nhật lại các bút toán định khoản", "Thông báo");

                    btnDinhKhoan.Enabled = true;
                    btnIn.Enabled = true;
                    btnSua.Enabled = true;
                    btnXoa.Enabled = true;
                    btnThem.Enabled = true;
                    btnLuu.Enabled = false;
                    panel1.Enabled = false;
                }

                else if (resultObj.ReturnCode == Definitions.DUPLICATED_VALUE)
                    MessageBox.Show("Dữ liệu bị trùng", "Thông báo");
                else
                    MessageBox.Show("Lưu không thành công", "Thông báo");
            }
        }

        private void btnDinhKhoan_Click(object sender, EventArgs e)
        {
            FrmDinhKhoanUyNhiemChi frmDinhKhoanUyNhiemChi = new FrmDinhKhoanUyNhiemChi();

            this.mUyNhiemChi.Id = Convert.ToInt32(lblId.Text);
            frmDinhKhoanUyNhiemChi.UyNhiemChi = this.mUyNhiemChi;
            frmDinhKhoanUyNhiemChi.Show();
        }

        private void btnIn_Click(object sender, EventArgs e)
        {
            string tienchu = CNum2Char.So2Chu((long)Convert.ToDouble(txtSoTien.Text.Replace(".", "")));
            string mauin = cboMauIn.Text;

            string donvichuyen = ((ChiNhanhCongTy)cboDonViChi.SelectedItem).TenChiNhanh;
            string tkchuyen = ((TaiKhoanGiaoDich)cboTaiKhoanChuyen.SelectedItem).SoTaiKhoanGiaoDich;
            string nganhangchuyen = ((NganHang)cboNganHangChuyen.SelectedItem).Ten;

            string donvinhan = ((NhaCungCap)cboDonViNhan.SelectedItem).TenNhaCungCap;
            string tknhan = ((TaiKhoanGiaoDichDoiTac)cboTaiKhoanNhan.SelectedItem).SoTaiKhoanGiaoDich;
            string nganhangnhan = ((NganHangDoiTac)cboNganHangNhan.SelectedItem).Ten;
            string diachinganhangnhan = ((NganHangDoiTac)cboNganHangNhan.SelectedItem).DiaChi;

            string noidung = txtNoiDung.Text;
            long sotien = Convert.ToInt64(txtSoTien.Text.Replace(".", ""));

            FrmXemReport frm = new FrmXemReport(tienchu, mauin, donvichuyen, tkchuyen, nganhangchuyen, donvinhan, tknhan, nganhangnhan, diachinganhangnhan, noidung, sotien);
            this.Hide();
            frm.ShowDialog();
            this.Show();
        }

        private void btnThem_Click(object sender, EventArgs e)
        {
            prefixOld = "";
            dtOld = new DateTime();

            btnLuu.Enabled = true;
            btnSua.Enabled = false;
            btnXoa.Enabled = false;
            btnIn.Enabled = false;
            btnDinhKhoan.Enabled = false;

            RefreshControl();
            txtNguoiLap.Text = this.nhanvien.HoTen;

            panel1.Enabled = true;
            IsEdited = false;
        }

        private void cboNganHangChuyen_Leave(object sender, EventArgs e)
        {
            foreach (NganHang b in cboNganHangChuyen.Items)
            {
                if (b.Ten.ToLower().Contains(cboNganHangChuyen.Text) && cboNganHangChuyen.Text != "")
                {
                    cboNganHangChuyen.SelectedValue = b.Id;
                    break;
                }
            }

            if (cboNganHangChuyen.SelectedValue == null)
            {
                cboNganHangChuyen.Text = "";
            }
        }

        private void cboNganHangNhan_Leave(object sender, EventArgs e)
        {
            foreach (NganHangDoiTac b in cboNganHangNhan.Items)
            {
                if (b.Ten.ToLower().Contains(cboNganHangNhan.Text) && cboNganHangNhan.Text != "")
                {
                    cboNganHangNhan.SelectedValue = b.Id;
                    break;
                }
            }

            if (cboNganHangNhan.SelectedValue == null)
            {
                cboNganHangNhan.Text = "";
            }
        }

        private void cboNganHangChuyen_SelectedIndexChanged(object sender, EventArgs e)
        {
            int id = ((NganHang)cboNganHangChuyen.SelectedItem).Id;
            List<TaiKhoanGiaoDich> lst = (from acc in GetAllTaiKhoanGiaoDich()
                                          where acc.IdNganHang == id
                                          select acc).ToList();
            cboTaiKhoanChuyen.DataSource = null;
            if (lst != null)
            {
                cboTaiKhoanChuyen.DataSource = lst;
                cboTaiKhoanChuyen.DisplayMember = "SoTaiKhoanGiaoDich";
                cboTaiKhoanChuyen.ValueMember = "Id";
            }
        }

        private void cboNganHangNhan_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboNganHangNhan.DataSource != null)
            {
                int id = ((NganHangDoiTac)cboNganHangNhan.SelectedItem).Id;
                List<TaiKhoanGiaoDichDoiTac> lst = (from acc in GetAllTaiKhoanGiaoDichDoiTac()
                                                    where acc.IdNganHang == id
                                                    select acc).ToList();

                cboTaiKhoanNhan.DataSource = null;
                if (lst != null)
                {
                    cboTaiKhoanNhan.DataSource = lst;
                    cboTaiKhoanNhan.DisplayMember = "SoTaiKhoanGiaoDich";
                    cboTaiKhoanNhan.ValueMember = "Id";
                }
            }
        }

        private void btnThoat_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void cboDonViNhan_SelectedIndexChanged(object sender, EventArgs e)
        {
            int id = ((NhaCungCap)cboDonViNhan.SelectedItem).Id;
            List<NganHangDoiTac> lst = (from acc in GetAllNganHangDoiTac()
                                        where acc.IdNCC == id
                                        select acc).ToList();

            cboNganHangNhan.DataSource = null;
            if (lst != null)
            {
                cboNganHangNhan.DataSource = lst;
                cboNganHangNhan.DisplayMember = "Ten";
                cboNganHangNhan.ValueMember = "Id";
            }
        }

        private void cboPrefix_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (prefixOld != ((BangMaPhieu)cboPrefix.SelectedItem).MaSo)
                txtMaSo.Text = cboPrefix.Text == "" ? "" : KiemTraMaSo.CheckCode(((BangMaPhieu)cboPrefix.SelectedItem).MaSo, idLoaiPhieu, dtpNgayThang.Value);
        }

        private void dtpNgayThang_ValueChanged(object sender, EventArgs e)
        {
            if (dtOld != dtpNgayThang.Value)
                txtMaSo.Text = cboPrefix.Text == "" ? "" : KiemTraMaSo.CheckCode(((BangMaPhieu)cboPrefix.SelectedItem).MaSo, idLoaiPhieu, dtpNgayThang.Value);
        }

        private void txtMaSo_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
            {
                e.Handled = true;
            }
        }

        private void txtMaSo_Leave(object sender, EventArgs e)
        {
            bool isDup = KiemTraMaSo.CheckOrderNumber(cboPrefix.Text, txtMaSo.Text, idLoaiPhieu, dtpNgayThang.Value);
            if (isDup)
            {
                MessageBox.Show("Mã phiếu bị trùng");
                txtMaSo.Focus();
            }
        }
    }
}
